#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <sys/socket.h>
#include <unistd.h> // for close()

// 发送消息（在消息前添加4字节长度头）
bool sendMessage(int sock, const std::string &msg)
{
    if (sock < 0)
        return false;
    // 1. 准备长度头
    uint32_t len = htonl(msg.length()); // 转换为主机字节序到网络字节序

    // 2. 发送长度头
    if (send(sock, &len, sizeof(len), 0) == -1)
    {
        perror("send length failed");
        return false;
    }

    // 3. 发送消息体
    if (send(sock, msg.c_str(), msg.length(), 0) == -1)
    {
        perror("send message failed");
        return false;
    }
    return true;
}

// 接收消息（先读取4字节长度头，再根据长度接收消息体）
bool receiveMessage(int sock, std::string &msg)
{
    if (sock < 0)
        return false;
    // 1. 接收长度头
    uint32_t len;
    if (recv(sock, &len, sizeof(len), 0) <= 0)
    { // <= 0 表示对方关闭或出错
        return false;
    }
    len = ntohl(len); // 转换回主机字节序

    // 2. 根据长度接收消息体
    std::vector<char> buffer(len);
    if (recv(sock, buffer.data(), len, MSG_WAITALL) <= 0)
    { // MSG_WAITALL确保接收完所有数据
        return false;
    }
    msg.assign(buffer.begin(), buffer.end());
    return true;
}